<?php
/**
 * Реализация двох интерфейсов (Zend_View_Interface и FRM_View_Extends_Interface)
 * С помощу этой реализации можна заменить стандартный View на вызов Smarty и его методов
 *
 */
require_once 'Smarty/Smarty.class.php';

class FRM_View_Smarty implements Zend_View_Interface, FRM_View_Extends_Interface
{
     /**
     * Объект Smarty
     * @var Smarty
     */
    protected $_smarty;
    
    /**
     * Название темплейта, который будит выводится
     *
     * @var string
     */
    protected $_template = null;

    /**
     * Конструктор
     *
     * @param string $tmplPath Путь где находятся темплейты
     * @param array $extraParams
     * @return void
     */
    /**
     * Конструктор
     *
     * @param string $tmplPath - Дериктория, где находятся темплейты
     * @param unknown_type $template - Название темплейта, который будит выводится
     * @param array $extraParams - Дополнительные параметры
     */
    public function __construct($tmplPath = null, $template = null, $extraParams = array())
    {
        //Создаем новый екземпляр Смарти
    	$this->_smarty = new Smarty;
    	
    	//Назначаем темплейт
		$this->_template = $template;
		
        if (!is_null($tmplPath)) {
            //Назначаем дрикторию
        	$this->setScriptPath($tmplPath);
        	
        	//Передаем директорию в шаблон
            $this->assign("template", $tmplPath);
        }
		
        //Вызываем дополнительные параметры
        foreach ($extraParams as $key => $value) {
            $this->_smarty->$key = $value;
        }
    }

    /**
     * Возвращение объекта шаблонизатора
     *
     * @return Smarty
     */
    public function getEngine()
    {
        return $this->_smarty;
    }

    /**
     * Установка пути к шаблонам
     *
     * @param string $path - Директория, устанавливаемая как путь к шаблонам
     * @return void
     */
    public function setScriptPath($path)
    {
    	if (is_readable($path)) {
            //Назначаем дрикторию c шаблонами
            
            $this->_smarty->template_dir = $path;
    		
    		//Назначаем дрикторию для скомпиленых шаблонов
            $this->_smarty->compile_dir = 'template_c';
            $this->_template = $path;
            $this->_smarty->compile_dir =  $this->_template . 'template_c';
            
        	$this->assign("template", $path);
        	
            return;
        }
        
		//Вызываем исключени, если дериктория неверна или нету прав
        //throw new Exception('Invalid path provided');
    }

    /**
     * Присвоение значения переменной шаблона
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    public function __set($key, $val)
    {
        $this->_smarty->assign($key, $val);
    }

    /**
     * Получение значения переменной
     *
     * @param string $key The variable name.
     * @return mixed The variable value.
     */
    public function __get($key)
    {
        return $this->_smarty->get_template_vars($key);
    }

    /**
     * Позволяет проверять переменные через empty() и isset()
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key)
    {
        return (null !== $this->_smarty->get_template_vars($key));
    }

    /**
     * Позволяет удалять свойства объекта через unset()
     *
     * @param string $key
     * @return void
     */
    public function __unset($key)
    {
        $this->_smarty->clear_assign($key);
    }

    /**
     * Присвоение переменных шаблону
     *
     * Позволяет установить значение к определенному ключу или передать массив
     * пар ключ => значение
     *
     * @param string|array $spec Ключ или массив пар ключ => значение
     * @param mixed $value (необязательный) Если присваивается значение одной
     * переменной, то через него передается значение переменной
     * @return void
     */
    public function assign($spec, $value = null)
    {
        if (is_array($spec)) {
            $this->_smarty->assign($spec);
            return;
        }

        $this->_smarty->assign($spec, $value);
    }

    /**
     * Удаление всех переменных
     *
     * @return void
     */
    public function clearVars()
    {
        $this->_smarty->clear_all_assign();
    }

    /**
     * Обрабатывает шаблон и возвращает вывод
     *
     * @param string $name Шаблон для обработки
     * @return string Вывод
     */
    public function render($name)
    {
    	//Передаем значение $name в шаблон
    	$this->assign("include", $name);
    	
    	//Смотрим, задано ли название шаблона в рантайме
    	if(!is_null($this->_template)){
    		//Если да, то позавыем шаблон с переменной $_template
    		return $this->_smarty->fetch($this->_template);
    	}
    	
    	//Если да, то позавыем шаблон с переменной $name
    	return $this->_smarty->fetch($name);	
    }
    
    /**
     * Получаем дерикторию, в которой содержатся темплейты
     *
     * @return string
     */
    public function getScriptPaths(){
    	return array($this->_smarty->template_dir);
    }
	
    /**
     * Получить содержимое View
     * 
     * @param string $template
     * @return string
     */
    public function fetch($template){
    	return $this->_smarty->fetch($template);
    }
    
    /**
     * Назначить темплейт для View.
     * С помощу этого метода можна назначить темплейт на этапе исполнение
     *
     * @param string $template
     */
    public function setTemplate($template){
    	$this->_template = $template;
    }
    
    /**
     *  Пустой, чтоб не ругалось, что не все методы указны для интерфесов
     *
     * @param string $path
     * @param string $classPrefix
     */
    public function setBasePath($path, $classPrefix = 'Zend_View'){
    	$this->setScriptPath($path);	
    }
	
    /**
     *  Пустой, чтоб не ругалось, что не все методы указны для интерфесов
     *
     * @param string $path
     * @param string $classPrefix
     */
    public function addBasePath($path, $classPrefix = 'Smarty'){
		//Передаем директорию в шаблон
		$this->setScriptPath($path);
    }
}
